  let arr = [{
      id: 1,
      name: '部门1',
      pid: 0
    },
    {
      id: 2,
      name: '部门2',
      pid: 1
    },
    {
      id: 3,
      name: '部门3',
      pid: 1
    },
    {
      id: 4,
      name: '部门4',
      pid: 3
    },
    {
      id: 5,
      name: '部门5',
      pid: 4
    },
  ]

  function arrToTree(arr) {
    // WeakMap 垃圾数据可以被回收
    const obMap = {}
    const obResult = []
    arr.forEach((value) => {
      const {
        id,
        pid
      } = value

      // 存储到对象中
      if (!obMap[id]) {
        obMap[id] = {
          children: [],
        }
      }
      // 处理每一项的解构
      obMap[id] = {
        ...value,
        children: obMap[id]['children'],
      }

      // 如果是跟节点 就添加
      if (pid === 0) {
        obResult.push(obMap[id])
      } else {
        // 如果不是根节点 就插入到她的父节点下
        if (!obMap[pid]) {
          // 如果父元素不存在 就先创建一个 等遇到父元素时 可以跳出上面的创建
          obMap[pid] = {
            children: [],
          }
        }
        obMap[pid].children.push(obMap[id])
      }
    })

    return obResult
  }

  console.log('arrToTree ==> ', arrToTree(arr))